package cn.ondraw.ragflow.pojo.request;

import lombok.Data;

import java.util.List;

/**
 * 创建聊天助手的请求对象
 */
@Data
public class CreateChatAssistantRequest {
    /**
     * 聊天助手的名称，必填
     */
    private String name;
    /**
     * 头像的 Base64 编码
     */
    private String avatar;
    /**
     * 关联数据集的 ID 列表
     */
    private List<String> dataset_ids;
    /**
     * 聊天助手的大语言模型设置
     */
    private LLM llm;
    /**
     * 大语言模型遵循的指令
     */
    private Prompt prompt;

    /**
     * 大语言模型设置的内部类
     */
    @Data
    public static class LLM {
        /**
         * 聊天模型名称，若未设置则使用用户的默认聊天模型
         */
        private String model_name;
        /**
         * 控制模型预测的随机性，值越低响应越保守，值越高越有创意和多样性，默认值 0.1
         */
        private Float temperature;
        /**
         * 核采样，设置阈值选择较小的词集进行采样，默认值 0.3
         */
        private Float top_p;
        /**
         * 惩罚已在对话中出现的词，避免重复信息，默认值 0.4
         */
        private Float presence_penalty;
        /**
         * 减少模型频繁重复相同词的倾向，默认值 0.7
         */
        private Float frequency_penalty;
    }

    /**
     * 大语言模型指令的内部类
     */
    @Data
    public static class Prompt {
        /**
         * 检索时用户查询与块之间相似度的阈值，默认值 0.2
         */
        private Float similarity_threshold;
        /**
         * 混合相似度分数中关键词相似度的权重，默认值 0.7
         */
        private Float keywords_similarity_weight;
        /**
         * 提供给大语言模型的相似度分数高于阈值的前 N 个块的数量，默认值 6
         */
        private Integer top_n;
        /**
         * 聊天配置中 'System' 字段使用的变量列表
         */
        private List<Variable> variables;
        /**
         * 重排序模型，若未指定则使用向量余弦相似度
         */
        private String rerank_model;
        /**
         * 基于特定排名标准对列表或集合中的前 k 个项目进行重新排序或选择，默认值 1024
         */
        private Integer top_k;
        /**
         * 数据集中未检索到用户问题的响应内容，留空则允许大语言模型即兴回答
         */
        private String empty_response;
        /**
         * 对用户的开场问候语，默认值 "Hi! I am your assistant, can I help you?"
         */
        private String opener;
        /**
         * 指示是否显示文本来源，默认值 true
         */
        private Boolean show_quote;
        /**
         * 提示内容
         */
        private String prompt;

        /**
         * 变量的内部类
         */
        @Data
        public static class Variable {
            /**
             * 变量键名
             */
            private String key;
            /**
             * 变量是否可选
             */
            private Boolean optional;
        }
    }
}
